import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Game extends JFrame{
    //定义图片标签
    JLabel image;
    //小图片的下标
    int index=0;
    JPanel mainbox;
    //空白按钮对象
    JButton nullBtn;
    public static void main(String[] args) {
        Game game=new Game();
//		显示窗口
        game.setVisible(true);

    }
    //
    public Game() {
        //初始化
        //大小
        setSize(370, 525);
//		title
        setTitle("拼图游戏");
        //居中显示
        setLocationRelativeTo(null);
//		关闭窗口程序结束
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //定义一个容器
        JPanel top_panel=new JPanel();
        //顶部容器定义布局方式(边界布局)
        top_panel.setLayout(new BorderLayout());
        //getContentPane()代表窗口对象 以下进行了顶部的摆放（北边）
        getContentPane().add(top_panel,BorderLayout.NORTH);
        //实例化标签
        image=new JLabel();
        //标签赋值
        image.setIcon(new ImageIcon("I:\\demo\\java\\swing_demo\\src\\images\\"+index+"model.jpg"));
        //我们把图片放到容器当中 西
        top_panel.add(image,BorderLayout.WEST);
//		定义按钮容器
        JPanel btnbox=new JPanel();
        //定义布局方式为网格布局
        btnbox.setLayout(new GridLayout(2,1));
        //把按钮的容器放到顶部容器的中间
        top_panel.add(btnbox,BorderLayout.CENTER);
        //定义按钮
        JButton start_btn=new JButton("开局");//开始
        start_btn.addActionListener(new StartClick());
        JButton next_btn=new JButton("下一张");//下一张
        //进行监听的关联
        next_btn.addActionListener(new NextClick());
        btnbox.add(start_btn);
        btnbox.add(next_btn);
        //定义下边4,4网格布局容器
        mainbox =new JPanel();
        mainbox.setLayout(new GridLayout(4,4));
        //给网格布局添加到父容器
        getContentPane().add(mainbox,BorderLayout.CENTER);
        //接受整理好的二维数组src
        String[][] imgsrc=imgSrc();
        //往网格当中放按钮
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                JButton btn=new JButton();
//				给每一个按钮命名
                btn.setName(i+""+j);
                btn.addActionListener(new ImgClick());
                mainbox.add(btn);
                //贴图
                btn.setIcon(new ImageIcon(imgsrc[i][j]));
                System.out.println(imgsrc[i][j]);
                //判断当前空白按钮的位置并赋值
                if(imgsrc[i][j].equals("I:\\demo\\java\\swing_demo\\src\\images\\"+index+"00.jpg")) {
                    nullBtn=btn;

                }
            }
        }
    }
    // 定义一个整理src的方法
    public String[][] imgSrc() {
        //为了把src存储到数组当中
        String [][] imgsrc=new String[4][4];
//		遍历二维数组
        for (int i = 0; i < imgsrc.length; i++) {
            for (int j = 0; j < imgsrc[i].length; j++) {
                imgsrc[i][j]="I:\\demo\\java\\swing_demo\\src\\images\\"+index+i+j+".jpg";
            }
        }
        return imgsrc;
    }
    //内部类实现监听接口
    class NextClick implements ActionListener{
        //具体操作方法
        @Override
        public void actionPerformed(ActionEvent e) {
            //思路：index的迭代 ++ 0~6
            index++;
            if (index>5) {
                index=0;
            }
            image.setIcon(new ImageIcon("I:\\demo\\java\\swing_demo\\src\\images\\"+index+"model.jpg"));
            //遍历每一个按钮给每一个按钮重新换图片
            String[][] imgsrc=imgSrc();
            int k=0;
            for (int i = 0; i < imgsrc.length; i++) {
                for (int j = 0; j < imgsrc[i].length; j++) {
                    //拿到父容器的每一个子元素通过k++进行迭代
                    JButton btn= (JButton) mainbox.getComponent(k++);
                    btn.setIcon(new ImageIcon(imgsrc[i][j]));
                    //判断当前空白按钮的位置并赋值
                    if(imgsrc[i][j].equals("I:\\demo\\java\\swing_demo\\src\\images\\"+index+"00.jpg")) {
                        nullBtn=btn;

                    }
                }
            }

        }
    }
    //定义开局按钮的监听
    class StartClick implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            /**
             * 思路：
             * 把原本有规律的二维数组进行随机排列然后返回进行重新贴图
             *
             * */
            String[][] re_src=re_src();
            int k=0;
            for (int i = 0; i < re_src.length; i++) {
                for (int j = 0; j < re_src[i].length; j++) {
                    //拿到父容器的每一个子元素通过k++进行迭代
                    JButton btn= (JButton) mainbox.getComponent(k++);
                    btn.setIcon(new ImageIcon(re_src[i][j]));
                    //判断当前空白按钮的位置并赋值
                    if(re_src[i][j].equals("I:\\demo\\java\\swing_demo\\src\\images\\"+index+"00.jpg")) {
                        nullBtn=btn;

                    }
                }
            }



        }

    }
    //图片打乱
    public String [][] re_src() {
        //老数组
        String lod_src[][]=imgSrc();
        String new_src[][]=new String[4][4];
        for (int i = 0; i < new_src.length; i++) {
            for (int j = 0; j < new_src[i].length; j++) {
                while(new_src[i][j]==null) {
                    int r=(int) (Math.random()*4);
                    int c=(int) (Math.random()*4);
                    if(lod_src[r][c]!=null) {
                        new_src[i][j]=lod_src[r][c];
                        lod_src[r][c]=null;
                    }
                }

            }
        }
        return new_src;
    }
    //图片按钮监听
    class ImgClick implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            //当前点击对象 拿到当前点击的按钮
            JButton btn=(JButton) e.getSource();
            System.out.println(btn.getName());
            //怎么知道挨着不挨着呢？ name 00 01....
            //知道了 i-i绝对值+j-j的绝对值=1
            String name= btn.getName();
            //charAt(下标)来检索子字符
            char name_i= name.charAt(0);
            char name_j=name.charAt(1);
            //拆分空白按钮的子字符
            String nullname= nullBtn.getName();
            char null_i=nullname.charAt(0);
            char null_j=nullname.charAt(1);

            //判断 i-i绝对值+j-j的绝对值=1  相邻
            if(Math.abs(name_i-null_i)+Math.abs(name_j-null_j)==1) {
                //空白按钮添加当前点击按钮的贴图
                nullBtn.setIcon(btn.getIcon());
                //覆盖当前按钮为白色贴图
                btn.setIcon(new ImageIcon("images/"+index+"00.jpg"));
                //把当前按钮赋值给空白按钮
                nullBtn=btn;
            }
        }


    }

}
